package jdk8.lambda;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;

import jdk8.lambda.funcionInterface.LanbdaInterface;

public class LambdaSyntax {
	/**
	语法 ： (parameters) ->{ statements; }
	特征 ：
		可选类型声明：不需要声明参数类型，编译器可以统一识别参数值。
		可选的参数圆括号：一个参数无需定义圆括号，但多个参数需要定义圆括号。
		可选的大括号：如果主体包含了一个语句，就不需要使用大括号。
		可选的返回关键字：如果主体只有一个表达式返回值则编译器会自动返回值，大括号需要指定明表达式返回了一个数值。

	 四种基本的函数式接口 :
	 	Predicate<T> [/ˈprɛdɪˌkeɪt/ ] 接口：
	 		boolean test(T t); 一个T类型参数，返回boolean类型值。
	 		基本写法：Predicate<Integer> predicate = x -> x > 5;

	 	Function<T, R> [/'fʌŋkʃən/] 功能接口：
	 		R apply(T t); 一个T类型参数，返回R类型值。
	 		基本写法：Function<Integer, Integer> function = x -> x + 1;

	 	Supplier<T> [/sə'plaɪɚ/]接口：
	 		T get(); 	无参数，返回一个T类型值。
	 		基本写法：Supplier<Integer> supplier = () -> 1;
	 	Consumer<T> [ /kən'sumɚ/ ] 接口：
	 		void accept(T t); 一个T类型参数，无返回值。
	 		基本写法：Consumer<Integer> consumer = x -> System.out.println(x);
	 				 Consumer<Integer> consumer = System.out::println;//方法引用的写法
	*/

	public static void main(String[] args) {
		// 第一例
		LanbdaInterface li = () -> System.out.println("this is a lambda expression");
		li.function();
		// 第二例
		List<String> list = Arrays.asList(new String[] { "a", "b", "c", "d", "e" });
		Consumer<String> consumer = x -> System.out.println(x + " 的hashCode是 " + x.hashCode());
		list.forEach(consumer);
		// 第三例
		String[] arr = new String[] { "a", "e", "b", "d", "c" };
		Comparator<String> comparator = (x, y) -> x.hashCode() - y.hashCode();
		Arrays.sort(arr, comparator);
		System.out.println(Arrays.deepToString(arr));

	}
}

